/*
 * Session.h
 * 
 * 会话抽象 - 对 TcpConnection 的封装
 * 提供会话级别的管理和用户数据存储
 */

#pragma once

#include <muduo/net/TcpConnection.h>
#include <muduo/base/Timestamp.h>
#include <muduo/base/noncopyable.h>

#include <memory>
#include <atomic>

namespace framework {

enum class SessionState {
    Connecting,
    Connected,
    Disconnecting,
    Disconnected
};

/**
 * @brief 会话类 - 封装 TCP 连接
 */
class Session : muduo::noncopyable,
                public std::enable_shared_from_this<Session> {
public:
    explicit Session(const muduo::net::TcpConnectionPtr& conn);
    ~Session();
    
    // 会话 ID
    uint64_t sessionId() const { return sessionId_; }
    
    // 获取底层连接
    muduo::net::TcpConnectionPtr getConnection() const;
    
    // 状态管理
    SessionState state() const { return state_; }
    void setState(SessionState state) { state_ = state; }
    bool isConnected() const { return state_ == SessionState::Connected; }
    
    // 发送数据
    void send(const std::string& data);
    void send(const void* data, size_t len);
    
    // 关闭连接
    void close();
    void forceClose();
    
    // 心跳管理
    void updateHeartbeat();
    muduo::Timestamp lastHeartbeat() const { return lastHeartbeat_; }
    
private:
    static std::atomic<uint64_t> s_sessionIdGenerator_;
    
    uint64_t sessionId_;                        // 唯一 ID
    std::weak_ptr<muduo::net::TcpConnection> conn_;  // 弱引用，避免循环引用
    SessionState state_;                        // 连接状态
    muduo::Timestamp lastHeartbeat_;            // 最后心跳时间
};

typedef std::shared_ptr<Session> SessionPtr;

} // namespace framework

